import Foundation

struct Localization {
    static let defaultLanguage = "en"

    static let languageCodes: [String: String] = [
        "1": "en",
        "2": "zh",
        "3": "ja",
        "4": "ko",
        "5": "fr",
        "6": "es",
        "7": "de",
        "8": "ru",
        "9": "hi",
        "10": "vi",
    ]

    static let languageMenu: [String] = [
        "en",
        "zh",
        "ja",
        "ko",
        "fr",
        "es",
        "de",
        "ru",
        "hi",
        "vi",
    ]

    static let languageDisplayNames: [String: String] = [
        "en": "English",
        "zh": "简体中文",
        "ja": "日本語",
        "ko": "한국어",
        "fr": "Français",
        "es": "Español",
        "de": "Deutsch",
        "ru": "Русский",
        "hi": "हिन्दी",
        "vi": "Tiếng Việt",
    ]

    static let languageHints: [String: String] = [
        "en": "Use ↑/↓ or 1-0 to choose, Enter to confirm, Q to cancel",
        "zh": "使用 ↑/↓ 或数字 1-0 选择，Enter 确认，Q 取消",
        "ja": "↑↓ または数字 1〜0 で選択、Enter で決定、Q で戻る",
        "ko": "↑↓ 또는 숫자 1-0 으로 선택, Enter 확인, Q 취소",
        "fr": "↑/↓ ou chiffres 1-0 pour choisir, Entrée pour valider, Q pour annuler",
        "es": "↑/↓ o números 1-0 para elegir, Enter para confirmar, Q para cancelar",
        "de": "Mit ↑/↓ oder Ziffern 1-0 wählen, Enter bestätigt, Q bricht ab",
        "ru": "↑/↓ или цифры 1-0 — выбор, Enter — подтвердить, Q — отменить",
        "hi": "↑/↓ या 1-0 से चुनें, Enter से पुष्टि करें, Q से रद्द करें",
        "vi": "Dùng ↑/↓ hoặc số 1-0 để chọn, Enter xác nhận, Q huỷ",
    ]

    static let yesNoLabelTable: [String: (String, String)] = [
        "zh": ("是", "否"),
        "ja": ("はい", "いいえ"),
        "ko": ("예", "아니오"),
        "fr": ("Oui", "Non"),
        "es": ("Sí", "No"),
        "de": ("Ja", "Nein"),
        "ru": ("Да", "Нет"),
        "hi": ("हाँ", "नहीं"),
        "vi": ("Có", "Không"),
    ]

    static let yesNoHints: [String: String] = [
        "en": "Use ←/→ to choose, Enter to confirm",
        "zh": "使用 ←/→ 切换，Enter 确认",
        "ja": "←→ で切替、Enter で決定",
        "ko": "←→ 로 선택, Enter 확인",
        "fr": "←/→ pour choisir, Entrée pour valider",
        "es": "←/→ para elegir, Enter para confirmar",
        "de": "←/→ zum Wählen, Enter bestätigt",
        "ru": "←/→ для выбора, Enter — подтвердить",
        "hi": "←→ से चुनें, Enter से पुष्टि करें",
        "vi": "Dùng ←→ chọn, Enter xác nhận",
    ]

    static let dictionary: [String: [String: String]] = [
        "en": [
            "language_prompt": "Select language:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nEnter choice [1]: ",
            "language_saved": "Language preference saved.",
            "fetching": "Fetching release metadata from {url}",
            "latest_tag": "Latest release tag: {tag}",
            "asset_selected": "Selected asset: {name} ({size} bytes)",
            "no_asset": "No release asset matches pattern {pattern}",
            "no_asset_auto": "No asset matches pattern {pattern}. Available assets: {assets}",
            "no_assets_available": "Release contains no downloadable assets.",
            "asset_fallback": "No asset matches pattern {pattern}. Select from available assets:",
            "prompt_asset_choice": "Select asset [1-{count}] (default 1): ",
            "downloading": "Downloading asset...",
            "download_complete": "Downloaded to {path} ({size} bytes)",
            "extracting": "Extracting archive...",
            "found_bundle": "Found bundle: {path}",
            "remove_quarantine_ok": "Removed quarantine attributes",
            "remove_quarantine_warn": "Warning: failed to remove quarantine attributes",
            "download_only_path": "Download-only: bundle available at {path}",
            "install_prepare": "Preparing to install into {path}",
            "requires_admin": "Administrator privileges required. Please enter your password if prompted.",
            "install_complete": "Installation complete",
            "relaunch_warn": "Warning: failed to relaunch LaunchNext automatically",
            "release_notes": "Release notes: {url}",
            "update_complete": "Update complete: {tag}",
            "update_elapsed": "Update finished in {seconds}s",
            "cancelled": "Update cancelled by user.",
            "prompt_continue": "Proceed with installation to {path}? [Y/n]: ",
            "prompt_download_only": "Download without installing? [y/N]: ",
            "invalid_choice": "Invalid choice.",
            "download_only_selected": "Download-only mode selected.",
            "download_and_install": "Download and install selected.",
            "about_to_install": "You are about to download and install {tag}.",
            "prompt_language_change": "Change language (current: {lang})? [y/N]: ",
            "press_enter": "Press Enter to close this window...",
            "sudo_password_prompt": "Enter password: ",
            "sudo_password_retry": "Incorrect password, please try again.",
        ],
        "zh": [
            "language_prompt": "选择语言：\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\n请输入序号 [1]：",
            "language_saved": "语言偏好已保存。",
            "fetching": "正在获取发布信息：{url}",
            "latest_tag": "最新版本标签：{tag}",
            "asset_selected": "已选择资源：{name}（{size} 字节）",
            "no_asset": "没有资源匹配正则：{pattern}",
            "no_asset_auto": "没有资源匹配正则 {pattern}。可用资源：{assets}",
            "no_assets_available": "该发布没有任何可下载资源。",
            "asset_fallback": "没有资源匹配正则 {pattern}，请选择下列资源：",
            "prompt_asset_choice": "请选择资源 [1-{count}]（默认 1）：",
            "downloading": "正在下载资源…",
            "download_complete": "已下载到 {path}（{size} 字节）",
            "extracting": "正在解压…",
            "found_bundle": "找到应用：{path}",
            "remove_quarantine_ok": "已移除隔离属性",
            "remove_quarantine_warn": "警告：移除隔离属性失败",
            "download_only_path": "仅下载模式：应用位于 {path}",
            "install_prepare": "准备安装到 {path}",
            "requires_admin": "需要管理员权限，请根据提示输入密码。",
            "install_complete": "安装完成",
            "relaunch_warn": "警告：自动重新打开 LaunchNext 失败",
            "release_notes": "更新说明：{url}",
            "update_complete": "更新完成：{tag}",
            "update_elapsed": "本次更新耗时 {seconds} 秒",
            "cancelled": "用户已取消更新。",
            "prompt_continue": "即将安装至 {path}，是否继续？[Y/n]：",
            "prompt_download_only": "是否仅下载而不安装？[y/N]：",
            "invalid_choice": "输入无效。",
            "download_only_selected": "已选择仅下载模式。",
            "download_and_install": "已选择下载并安装。",
            "about_to_install": "即将下载并安装 {tag}。",
            "prompt_language_change": "更改语言（当前：{lang}）？[y/N]：",
            "press_enter": "按回车键关闭此窗口…",
            "sudo_password_prompt": "请输入密码：",
            "sudo_password_retry": "密码错误，请重试。",
        ],
        "ja": [
            "language_prompt": "言語を選択してください:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\n選択 [1]: ",
            "language_saved": "言語設定を保存しました。",
            "fetching": "{url} からリリース情報を取得中",
            "latest_tag": "最新リリースタグ: {tag}",
            "asset_selected": "選択したアセット: {name} ({size} バイト)",
            "no_asset": "パターン {pattern} に一致するアセットがありません",
            "no_asset_auto": "パターン {pattern} に一致するアセットがありません。利用可能: {assets}",
            "no_assets_available": "このリリースにはダウンロード可能なアセットがありません。",
            "asset_fallback": "パターン {pattern} に一致するアセットがありません。以下から選択してください:",
            "prompt_asset_choice": "アセットを選択 [1-{count}] (デフォルト 1): ",
            "downloading": "アセットをダウンロード中…",
            "download_complete": "{path} にダウンロード完了 ({size} バイト)",
            "extracting": "アーカイブを展開しています…",
            "found_bundle": "アプリを検出: {path}",
            "remove_quarantine_ok": "隔離属性を削除しました",
            "remove_quarantine_warn": "警告: 隔離属性の削除に失敗しました",
            "download_only_path": "ダウンロードのみモード: {path} に保存しました",
            "install_prepare": "{path} へインストール準備中",
            "requires_admin": "管理者権限が必要です。求められたらパスワードを入力してください。",
            "install_complete": "インストール完了",
            "relaunch_warn": "警告: LaunchNext の自動再起動に失敗しました",
            "release_notes": "リリースノート: {url}",
            "update_complete": "アップデート完了: {tag}",
            "update_elapsed": "アップデート完了所要時間 {seconds} 秒",
            "cancelled": "ユーザーがアップデートをキャンセルしました。",
            "prompt_continue": "{path} にインストールしますか？ [Y/n]: ",
            "prompt_download_only": "インストールせずダウンロードのみ行いますか？ [y/N]: ",
            "invalid_choice": "無効な入力です。",
            "download_only_selected": "ダウンロードのみモードを選択しました。",
            "download_and_install": "ダウンロードおよびインストールを選択しました。",
            "about_to_install": "{tag} をダウンロードしてインストールします。",
            "prompt_language_change": "言語を変更しますか (現在: {lang})? [y/N]: ",
            "press_enter": "このウィンドウを閉じるには Enter を押してください…",
            "sudo_password_prompt": "パスワードを入力してください：",
            "sudo_password_retry": "パスワードが違います。もう一度入力してください。",
        ],
        "ko": [
            "language_prompt": "언어를 선택하세요:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\n선택 [1]: ",
            "language_saved": "언어 설정이 저장되었습니다.",
            "fetching": "릴리스 정보를 가져오는 중: {url}",
            "latest_tag": "최신 릴리스 태그: {tag}",
            "asset_selected": "선택된 에셋: {name} ({size} bytes)",
            "no_asset": "정규식 {pattern} 에 일치하는 에셋이 없습니다.",
            "no_asset_auto": "정규식 {pattern} 에 일치하는 에셋이 없습니다. 사용 가능: {assets}",
            "no_assets_available": "이 릴리스에는 다운로드할 에셋이 없습니다.",
            "asset_fallback": "정규식 {pattern} 에 일치하는 에셋이 없습니다. 아래에서 선택하세요:",
            "prompt_asset_choice": "에셋 선택 [1-{count}] (기본 1): ",
            "downloading": "에셋 다운로드 중…",
            "download_complete": "{path} 에 다운로드 완료 ({size} bytes)",
            "extracting": "압축 해제 중…",
            "found_bundle": "앱 번들을 찾았습니다: {path}",
            "remove_quarantine_ok": "격리 속성을 제거했습니다",
            "remove_quarantine_warn": "경고: 격리 속성 제거 실패",
            "download_only_path": "다운로드 모드: {path} 위치에 저장",
            "install_prepare": "{path} 에 설치 준비 중",
            "requires_admin": "관리자 권한이 필요합니다. 암호를 입력해 주세요.",
            "install_complete": "설치 완료",
            "relaunch_warn": "경고: LaunchNext 자동 실행 실패",
            "release_notes": "릴리스 노트: {url}",
            "update_complete": "업데이트 완료: {tag}",
            "update_elapsed": "소요 시간: {seconds}초",
            "cancelled": "사용자가 업데이트를 취소했습니다.",
            "prompt_continue": "{path} 에 설치합니다. 계속할까요? [Y/n]: ",
            "prompt_download_only": "설치 없이 다운로드만 하시겠습니까? [y/N]: ",
            "invalid_choice": "잘못된 입력입니다.",
            "download_only_selected": "다운로드 전용 모드가 선택되었습니다.",
            "download_and_install": "다운로드 후 설치가 선택되었습니다.",
            "about_to_install": "{tag} 버전을 다운로드하여 설치합니다.",
            "prompt_language_change": "언어를 변경하시겠습니까 (현재: {lang})? [y/N]: ",
            "press_enter": "창을 닫으려면 Enter 키를 누르세요…",
            "sudo_password_prompt": "암호를 입력하세요:",
            "sudo_password_retry": "암호가 올바르지 않습니다. 다시 시도하세요.",
        ],
        "fr": [
            "language_prompt": "Sélectionnez la langue :\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nEntrez votre choix [1] : ",
            "language_saved": "Préférence linguistique enregistrée.",
            "fetching": "Récupération des métadonnées de la version depuis {url}",
            "latest_tag": "Dernier tag de version : {tag}",
            "asset_selected": "Fichier sélectionné : {name} ({size} octets)",
            "no_asset": "Aucun fichier ne correspond au modèle {pattern}",
            "no_asset_auto": "Aucun fichier ne correspond au modèle {pattern}. Fichiers disponibles : {assets}",
            "no_assets_available": "Cette version ne contient aucun fichier téléchargeable.",
            "asset_fallback": "Aucun fichier ne correspond au modèle {pattern}. Sélectionnez l'un des fichiers suivants :",
            "prompt_asset_choice": "Sélectionnez un fichier [1-{count}] (par défaut 1) : ",
            "downloading": "Téléchargement du fichier…",
            "download_complete": "Téléchargement effectué vers {path} ({size} octets)",
            "extracting": "Extraction de l’archive…",
            "found_bundle": "Application trouvée : {path}",
            "remove_quarantine_ok": "Attributs de quarantaine supprimés",
            "remove_quarantine_warn": "Avertissement : impossible de supprimer les attributs de quarantaine",
            "download_only_path": "Mode téléchargement uniquement : application disponible dans {path}",
            "install_prepare": "Préparation de l’installation dans {path}",
            "requires_admin": "Privilèges administrateur requis. Veuillez saisir votre mot de passe si nécessaire.",
            "install_complete": "Installation terminée",
            "relaunch_warn": "Avertissement : impossible de relancer LaunchNext automatiquement",
            "release_notes": "Notes de version : {url}",
            "update_complete": "Mise à jour terminée : {tag}",
            "update_elapsed": "Mise à jour effectuée en {seconds}s",
            "cancelled": "Mise à jour annulée par l’utilisateur.",
            "prompt_continue": "Procéder à l’installation vers {path} ?",
            "prompt_download_only": "Télécharger sans installer ?",
            "invalid_choice": "Choix invalide.",
            "download_only_selected": "Mode téléchargement uniquement sélectionné.",
            "download_and_install": "Mode téléchargement + installation sélectionné.",
            "about_to_install": "Vous allez télécharger et installer la version {tag}.",
            "prompt_language_change": "Changer de langue (actuelle : {lang}) ?",
            "press_enter": "Appuyez sur Entrée pour fermer cette fenêtre…",
            "sudo_password_prompt": "Saisissez le mot de passe :",
            "sudo_password_retry": "Mot de passe incorrect, réessayez.",
        ],
        "es": [
            "language_prompt": "Seleccione el idioma:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nOpción [1]: ",
            "language_saved": "Preferencia de idioma guardada.",
            "fetching": "Obteniendo metadatos de la versión desde {url}",
            "latest_tag": "Etiqueta de la última versión: {tag}",
            "asset_selected": "Recurso seleccionado: {name} ({size} bytes)",
            "no_asset": "No hay recursos que coincidan con el patrón {pattern}",
            "no_asset_auto": "No hay recursos que coincidan con el patrón {pattern}. Disponibles: {assets}",
            "no_assets_available": "Esta versión no contiene recursos descargables.",
            "asset_fallback": "No hay recursos que coincidan con el patrón {pattern}. Elija uno:",
            "prompt_asset_choice": "Seleccione un recurso [1-{count}] (predeterminado 1): ",
            "downloading": "Descargando recurso…",
            "download_complete": "Descarga completada en {path} ({size} bytes)",
            "extracting": "Extrayendo el archivo…",
            "found_bundle": "Aplicación encontrada: {path}",
            "remove_quarantine_ok": "Atributo de cuarentena eliminado",
            "remove_quarantine_warn": "Advertencia: no se pudo eliminar el atributo de cuarentena",
            "download_only_path": "Solo descarga: aplicación disponible en {path}",
            "install_prepare": "Preparando instalación en {path}",
            "requires_admin": "Se requieren privilegios de administrador. Introduzca la contraseña si se le solicita.",
            "install_complete": "Instalación completada",
            "relaunch_warn": "Advertencia: no se pudo relanzar LaunchNext automáticamente",
            "release_notes": "Notas de la versión: {url}",
            "update_complete": "Actualización completada: {tag}",
            "update_elapsed": "Actualización terminada en {seconds} s",
            "cancelled": "Actualización cancelada por el usuario.",
            "prompt_continue": "¿Instalar en {path}? [Y/n]: ",
            "prompt_download_only": "¿Descargar sin instalar? [y/N]: ",
            "invalid_choice": "Opción no válida.",
            "download_only_selected": "Modo solo descarga seleccionado.",
            "download_and_install": "Modo descargar e instalar seleccionado.",
            "about_to_install": "Vas a descargar e instalar {tag}.",
            "prompt_language_change": "¿Cambiar idioma (actual: {lang})? [y/N]: ",
            "press_enter": "Pulse Enter para cerrar esta ventana…",
            "sudo_password_prompt": "Introduce la contraseña:",
            "sudo_password_retry": "Contraseña incorrecta, inténtalo de nuevo.",
        ],
        "de": [
            "language_prompt": "Sprache wählen:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nAuswahl [1]: ",
            "language_saved": "Spracheinstellung gespeichert.",
            "fetching": "Rufe Release-Metadaten von {url} ab",
            "latest_tag": "Neuester Release-Tag: {tag}",
            "asset_selected": "Ausgewählte Datei: {name} ({size} Bytes)",
            "no_asset": "Keine Datei entspricht dem Muster {pattern}",
            "no_asset_auto": "Keine Datei entspricht dem Muster {pattern}. Verfügbar: {assets}",
            "no_assets_available": "Dieser Release enthält keine herunterladbaren Dateien.",
            "asset_fallback": "Keine Datei entspricht dem Muster {pattern}. Bitte wählen:",
            "prompt_asset_choice": "Datei wählen [1-{count}] (Standard 1): ",
            "downloading": "Datei wird heruntergeladen…",
            "download_complete": "Heruntergeladen nach {path} ({size} Bytes)",
            "extracting": "Archiv wird entpackt…",
            "found_bundle": "App-Bundle gefunden: {path}",
            "remove_quarantine_ok": "Quarantäne-Attribute entfernt",
            "remove_quarantine_warn": "Warnung: Quarantäne-Attribute konnten nicht entfernt werden",
            "download_only_path": "Nur-Download-Modus: App liegt unter {path}",
            "install_prepare": "Installation nach {path} wird vorbereitet",
            "requires_admin": "Administratorrechte erforderlich. Passwort bei Aufforderung eingeben.",
            "install_complete": "Installation abgeschlossen",
            "relaunch_warn": "Warnung: LaunchNext konnte nicht automatisch neu gestartet werden",
            "release_notes": "Release Notes: {url}",
            "update_complete": "Update abgeschlossen: {tag}",
            "update_elapsed": "Update abgeschlossen in {seconds} s",
            "cancelled": "Update vom Benutzer abgebrochen.",
            "prompt_continue": "Nach {path} installieren? [Y/n]: ",
            "prompt_download_only": "Nur herunterladen, nicht installieren? [y/N]: ",
            "invalid_choice": "Ungültige Auswahl.",
            "download_only_selected": "Nur-Download-Modus ausgewählt.",
            "download_and_install": "Download und Installation ausgewählt.",
            "about_to_install": "Sie sind dabei, {tag} herunterzuladen und zu installieren.",
            "prompt_language_change": "Sprache ändern (aktuell: {lang})? [y/N]: ",
            "press_enter": "Zum Schließen Enter drücken…",
            "sudo_password_prompt": "Passwort eingeben:",
            "sudo_password_retry": "Falsches Passwort, bitte erneut versuchen.",
        ],
        "ru": [
            "language_prompt": "Выберите язык:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nВыбор [1]: ",
            "language_saved": "Настройки языка сохранены.",
            "fetching": "Получение данных релиза: {url}",
            "latest_tag": "Последний тег релиза: {tag}",
            "asset_selected": "Выбран файл: {name} ({size} байт)",
            "no_asset": "Нет файлов, соответствующих шаблону {pattern}",
            "no_asset_auto": "Нет файлов, соответствующих шаблону {pattern}. Доступны: {assets}",
            "no_assets_available": "У этого релиза нет файлов для загрузки.",
            "asset_fallback": "Нет файлов по шаблону {pattern}. Выберите из списка:",
            "prompt_asset_choice": "Выберите файл [1-{count}] (по умолчанию 1): ",
            "downloading": "Скачивание файла…",
            "download_complete": "Загружено в {path} ({size} байт)",
            "extracting": "Распаковка архива…",
            "found_bundle": "Найден пакет приложения: {path}",
            "remove_quarantine_ok": "Атрибут карантина удалён",
            "remove_quarantine_warn": "Предупреждение: не удалось удалить атрибут карантина",
            "download_only_path": "Только загрузка: приложение доступно по пути {path}",
            "install_prepare": "Подготовка к установке в {path}",
            "requires_admin": "Требуются права администратора. Введите пароль при запросе.",
            "install_complete": "Установка завершена",
            "relaunch_warn": "Предупреждение: не удалось автоматически перезапустить LaunchNext",
            "release_notes": "Заметки о выпуске: {url}",
            "update_complete": "Обновление завершено: {tag}",
            "update_elapsed": "Обновление заняло {seconds} с",
            "cancelled": "Обновление отменено пользователем.",
            "prompt_continue": "Установить в {path}? [Y/n]: ",
            "prompt_download_only": "Скачать без установки? [y/N]: ",
            "invalid_choice": "Неверный выбор.",
            "download_only_selected": "Выбран режим только загрузки.",
            "download_and_install": "Выбран режим загрузки и установки.",
            "about_to_install": "Сейчас будет загружен и установлен {tag}.",
            "prompt_language_change": "Изменить язык (текущий: {lang})? [y/N]: ",
            "press_enter": "Нажмите Enter, чтобы закрыть это окно…",
            "sudo_password_prompt": "Введите пароль:",
            "sudo_password_retry": "Неверный пароль, попробуйте ещё раз.",
        ],
        "hi": [
            "language_prompt": "भाषा चुनें:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nचयन करें [1]: ",
            "language_saved": "भाषा वरीयता सहेजी गई।",
            "fetching": "{url} से रिलीज़ मेटाडाटा प्राप्त किया जा रहा है",
            "latest_tag": "नवीनतम रिलीज़ टैग: {tag}",
            "asset_selected": "चयनित संसाधन: {name} ({size} बाइट्स)",
            "no_asset": "{pattern} पैटर्न से मेल खाने वाला कोई संसाधन नहीं है",
            "no_asset_auto": "{pattern} पैटर्न से मेल खाने वाला कोई संसाधन नहीं है। उपलब्ध: {assets}",
            "no_assets_available": "इस रिलीज़ में कोई डाउनलोड करने योग्य संसाधन नहीं है।",
            "asset_fallback": "{pattern} पैटर्न से मेल खाने वाला कोई संसाधन नहीं है। कृपया नीचे से चुनें:",
            "prompt_asset_choice": "संसाधन चुनें [1-{count}] (डिफ़ॉल्ट 1): ",
            "downloading": "संसाधन डाउनलोड किया जा रहा है…",
            "download_complete": "{path} पर डाउनलोड पूरा ({size} बाइट्स)",
            "extracting": "आर्काइव निकाला जा रहा है…",
            "found_bundle": "ऐप बंडल मिला: {path}",
            "remove_quarantine_ok": "क्वारंटीन विशेषता हटाई गई",
            "remove_quarantine_warn": "चेतावनी: क्वारंटीन विशेषता हटाने में विफल",
            "download_only_path": "केवल डाउनलोड मोड: ऐप {path} पर उपलब्ध है",
            "install_prepare": "{path} में इंस्टॉल की तैयारी",
            "requires_admin": "प्रशासक अधिकार आवश्यक हैं। अनुरोध होने पर पासवर्ड दर्ज करें।",
            "install_complete": "इंस्टॉलेशन पूरा",
            "relaunch_warn": "चेतावनी: LaunchNext को स्वतः पुनः खोलने में असफल",
            "release_notes": "रिलीज़ नोट्स: {url}",
            "update_complete": "अपडेट पूरा: {tag}",
            "update_elapsed": "अपडेट को {seconds} सेकंड लगे",
            "cancelled": "उपयोगकर्ता ने अपडेट रद्द कर दिया।",
            "prompt_continue": "{path} में इंस्टॉल करें? [Y/n]: ",
            "prompt_download_only": "बिना इंस्टॉल किए केवल डाउनलोड करें? [y/N]: ",
            "invalid_choice": "अमान्य विकल्प।",
            "download_only_selected": "केवल डाउनलोड मोड चुना गया।",
            "download_and_install": "डाउनलोड और इंस्टॉल मोड चुना गया।",
            "about_to_install": "आप अभी {tag} डाउनलोड और इंस्टॉल करने वाले हैं।",
            "prompt_language_change": "भाषा बदलें (वर्तमान: {lang})? [y/N]: ",
            "press_enter": "इस विंडो को बंद करने के लिए Enter दबाएँ…",
            "sudo_password_prompt": "पासवर्ड दर्ज करें:",
            "sudo_password_retry": "गलत पासवर्ड, कृपया पुनः प्रयास करें।",
        ],
        "vi": [
            "language_prompt": "Chọn ngôn ngữ:\n  1) English\n  2) 简体中文\n  3) 日本語\n  4) 한국어\n  5) Français\n  6) Español\n  7) Deutsch\n  8) Русский\n  9) हिन्दी\n 10) Tiếng Việt\nNhập lựa chọn [1]: ",
            "language_saved": "Đã lưu tùy chọn ngôn ngữ.",
            "fetching": "Đang lấy thông tin phát hành từ {url}",
            "latest_tag": "Tag phát hành mới nhất: {tag}",
            "asset_selected": "Tệp đã chọn: {name} ({size} byte)",
            "no_asset": "Không có tệp nào khớp với biểu thức {pattern}",
            "no_asset_auto": "Không có tệp khớp với biểu thức {pattern}. Các tệp sẵn có: {assets}",
            "no_assets_available": "Bản phát hành này không có tệp có thể tải xuống.",
            "asset_fallback": "Không có tệp khớp với biểu thức {pattern}. Hãy chọn một trong các tùy chọn sau:",
            "prompt_asset_choice": "Chọn tệp [1-{count}] (mặc định 1): ",
            "downloading": "Đang tải xuống…",
            "download_complete": "Đã tải xuống {path} ({size} byte)",
            "extracting": "Đang giải nén gói…",
            "found_bundle": "Đã tìm thấy ứng dụng: {path}",
            "remove_quarantine_ok": "Đã xóa thuộc tính cách ly",
            "remove_quarantine_warn": "Cảnh báo: Không thể xóa thuộc tính cách ly",
            "download_only_path": "Chỉ tải xuống: ứng dụng nằm tại {path}",
            "install_prepare": "Đang chuẩn bị cài đặt vào {path}",
            "requires_admin": "Cần quyền quản trị. Nhập mật khẩu khi được yêu cầu.",
            "install_complete": "Cài đặt hoàn tất",
            "relaunch_warn": "Cảnh báo: Không thể mở lại LaunchNext tự động",
            "release_notes": "Ghi chú phát hành: {url}",
            "update_complete": "Cập nhật hoàn tất: {tag}",
            "update_elapsed": "Hoàn tất sau {seconds} giây",
            "cancelled": "Người dùng đã hủy cập nhật.",
            "prompt_continue": "Cài đặt vào {path}? [Y/n]: ",
            "prompt_download_only": "Chỉ tải xuống mà không cài đặt? [y/N]: ",
            "invalid_choice": "Lựa chọn không hợp lệ.",
            "download_only_selected": "Đã chọn chế độ chỉ tải xuống.",
            "download_and_install": "Đã chọn chế độ tải xuống và cài đặt.",
            "about_to_install": "Bạn sắp tải và cài đặt {tag}.",
            "prompt_language_change": "Thay đổi ngôn ngữ (hiện tại: {lang})? [y/N]: ",
            "press_enter": "Nhấn Enter để đóng cửa sổ này…",
            "sudo_password_prompt": "Nhập mật khẩu:",
            "sudo_password_retry": "Mật khẩu không đúng, vui lòng thử lại.",
        ],
    ]

    static var supportedLanguages: [String] { Array(languageMenu) }

    static func strings(for code: String) -> [String: String] {
        dictionary[code] ?? dictionary[defaultLanguage] ?? [:]
    }

    static func string(_ key: String, language code: String, replacements: [String: CustomStringConvertible] = [:]) -> String {
        let base = strings(for: code)[key] ?? strings(for: defaultLanguage)[key] ?? key
        guard !replacements.isEmpty else { return base }
        var result = base
        for (token, value) in replacements {
            result = result.replacingOccurrences(of: "{\(token)}", with: String(describing: value))
        }
        return result
    }

    static func languageOptions() -> [(String, String)] {
        languageMenu.map { ($0, languageDisplayNames[$0] ?? $0) }
    }

    static func yesNoLabels(for code: String) -> (String, String) {
        yesNoLabelTable[code] ?? ("Yes", "No")
    }

    static func yesNoHint(for code: String) -> String {
        yesNoHints[code] ?? yesNoHints[defaultLanguage] ?? ""
    }

    static func languageHint(for code: String) -> String {
        languageHints[code] ?? languageHints[defaultLanguage] ?? ""
    }
}
